package com.app.common_app.controller;

import com.app.common_app.dto.UserDto;
import com.app.common_app.service.UserService;
import com.app.public_dependency.exception.GlobalException;
import com.app.public_dependency.response.Result;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.bind.annotation.*;

/**
 * @author zhangzy
 * @description 用户控制器
 */
@RestController
@Slf4j
@RequestMapping("user")
@RequiredArgsConstructor(onConstructor = @__(@Lazy))
@CrossOrigin
public class UserController {
    private final UserService userService;

    /**
     * 用户登录
     *
     * @param userDto 登录信息
     * @return 登录状态
     */
    @PostMapping("login")
    public Result login(@RequestBody UserDto userDto, @CookieValue(value = "AuthorToken", defaultValue = "Null") String cookie, ServerHttpResponse response) {
        /*
          实现逻辑：
          1、登录信息有：username password autoLogin type
          2、需要先判断type是账号密码登录还是手机号验证
          （以下为账号密码登陆方式）
          3、取cookie是否有信息
           3.1、cookie中如果没有信息说明首次登陆，正常流程（从4开始）
           3.2、cookie中如果有信息，查redis中有没有信息
               3.2.1、redis中没有信息，说明没用自动登录，需要重新登陆，正常流程（从4开始）
               3.2.2、redis中有信息，说明之前用的是自动登录（此处可能会往前端传自动登录按钮状态），需要对比redis和cookie中信息是否一致，如果不一致正常走流程（从4开始）
          4、查数据库 username 和 password 如果有数据证明登录成功，通过jwt使用用户信息生成token，放到cookie中
          5、如果用户勾选自动登录，autoLogin为true，将token信息保存到redis中一份，key值为用户名
          （以下为手机号验证登录方式）
          TODO：...
         */
        Result result = null;
        if ("account".equals(userDto.getType())) {
            return userService.accountLogin(userDto.getUsername(), userDto.getPassword(), userDto.getAutoLogin(), cookie, response);
        } else if ("mobile".equals(userDto.getType())) {
            System.out.println("mobile");
            result = userService.mobileLogin();
            // TODO: 手机号验证登录方式具体实现
        } else {
            throw new GlobalException("未知登陆方式");
        }
        return Result.error(500, "登录失败");
    }

    /**
     * 获取当前用户信息
     *
     * @return 用户信息
     */
    @GetMapping("currentUser")
    public Result fetchUserInfo(@CookieValue(value = "AuthorToken", defaultValue = "Null") String cookie) {
        return userService.fetchUserInfo(cookie);
    }

    /**
     * 退出登录
     * @param response 响应Http
     * @return 结果状态
     */
    @PostMapping("loginOut")
    public Result loginOut(@CookieValue(value = "AuthorToken", defaultValue = "Null") String cookie, ServerHttpResponse response) {
        /*
         * 清除cookie redis中数据
         */
        return userService.loginOut(cookie, response);
    }
}
